﻿using D.Domain.SeedWork.EventUtil;

namespace D.Domain.SeedWork.EventBusUtil
{
    /// <summary>
    /// 领域事件,分发Event
    /// </summary>
    public interface IEventBus
    {
        //void Publish<T>(T @event) where T : DomainEvent;

        /// <summary>
        /// 获取所有事件
        /// </summary>
        /// <returns></returns>
        IEnumerable<INotification> GetEvents();

        /// <summary>
        /// 添加事件
        /// </summary>
        /// <param name="eventItem"></param>
        void AddEvent(INotification eventItem);

        /// <summary>
        /// 添加事件
        /// 如果已经存在这个元素，则跳过，否则增加。以避免对于同样的事件触发多次（比如在一个事务中修改领域模型的多个对象）
        /// </summary>
        /// <param name="eventItem"></param>
        void AddEventIfAbsent(INotification eventItem);

        /// <summary>
        /// 清除所有事件
        /// </summary>
        void ClearEvents();
    }
}
